home *** CD-ROM | disk | FTP | other *** search
/ PC for Alla 2003 May / PFA0503.iso / fullversioner / webmenubuilder / WebMenuBuilder2demo / setup.exe / {app} / help / SearchDocument.class (.txt) < prev    next >
Encoding:
Java Class File  |  2002-03-22  |  7.6 KB  |  472 lines

  1. import java.io.BufferedInputStream;
  2. import java.io.FileNotFoundException;
  3. import java.io.IOException;
  4. import java.net.MalformedURLException;
  5. import java.net.URL;
  6. import java.net.URLConnection;
  7. import java.util.Date;
  8.  
  9. public class SearchDocument {
  10.    private static final String[] months = new String[]{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
  11.    private BufferedInputStream bis;
  12.    private volatile boolean interruptSearch;
  13.    private boolean gotDocumentInfo;
  14.    private boolean gotTitle;
  15.    private volatile boolean noHorribleError = false;
  16.    private URL url;
  17.    private String relativeURL;
  18.    private String title;
  19.    private String documentInfo;
  20.    private String contextString;
  21.    private String nearestAnchor;
  22.    private int leadingContextLength;
  23.    private int trailingContextLength;
  24.    private SearchSieve titleFinder = new SearchSieve("<title>", false);
  25.    private SearchSieve anchorFinder = new SearchSieve("<a name=", false);
  26.    private String stopPattern;
  27.    private boolean useStopPattern = false;
  28.    private String startPattern;
  29.    private boolean useStartPattern = false;
  30.  
  31.    public SearchDocument(URL var1, String var2, int var3, int var4) throws MalformedURLException {
  32.       this.url = buildURL(var1, var2);
  33.       this.noHorribleError = true;
  34.       this.gotDocumentInfo = false;
  35.       this.gotTitle = false;
  36.       this.title = "";
  37.       this.documentInfo = "";
  38.       this.relativeURL = var2;
  39.       this.interruptSearch = false;
  40.       this.contextString = null;
  41.       if (var3 < 0) {
  42.          throw new IllegalArgumentException("leadingContextLength < 0");
  43.       } else {
  44.          this.leadingContextLength = var3;
  45.          if (var4 < 0) {
  46.             throw new IllegalArgumentException("trailingContextLength < 0");
  47.          } else {
  48.             this.trailingContextLength = var4;
  49.          }
  50.       }
  51.    }
  52.  
  53.    private static final URL buildURL(URL var0, String var1) throws MalformedURLException {
  54.       Object var2 = null;
  55.       int var3 = var1.length();
  56.       URL var8;
  57.       if (var1.startsWith("../")) {
  58.          int var4 = 3;
  59.          String var5 = var0.getFile();
  60.          int var6 = var5.lastIndexOf(47);
  61.          if (var6 != -1) {
  62.             var6 = var5.lastIndexOf(47, var6 - 1);
  63.          }
  64.  
  65.          while(var1.startsWith("../", var4)) {
  66.             var6 = var5.lastIndexOf(47, var6 - 1);
  67.             var4 += 3;
  68.             if (var6 == -1) {
  69.                throw new MalformedURLException("Higher than root: " + var0.toString() + " + " + var1);
  70.             }
  71.          }
  72.  
  73.          if (var4 != var3) {
  74.             var1 = var1.substring(var4, var3);
  75.          } else {
  76.             var1 = "";
  77.          }
  78.  
  79.          if (var6 != -1) {
  80.             var5 = var5.substring(0, var6 + 1);
  81.             if (var4 != var3) {
  82.                var5 = var5 + var1;
  83.             }
  84.          } else {
  85.             var5 = "/" + var1;
  86.          }
  87.  
  88.          var8 = new URL(var0.getProtocol(), var0.getHost(), var5);
  89.       } else if (var1.startsWith("/")) {
  90.          var8 = new URL(var0.getProtocol(), var0.getHost(), var1);
  91.       } else if (var1.startsWith("./")) {
  92.          var8 = new URL(var0, var1.substring(2, var3));
  93.       } else if (var1.startsWith("?")) {
  94.          var8 = new URL(var0.getProtocol(), var0.getHost(), var0.getFile() + var1);
  95.       } else {
  96.          var8 = new URL(var0, var1);
  97.       }
  98.  
  99.       return var8;
  100.    }
  101.  
  102.    public String getDocumentTitle() {
  103.       return this.title;
  104.    }
  105.  
  106.    public String getDocumentInfo() {
  107.       return this.documentInfo;
  108.    }
  109.  
  110.    public String getRelativeURL() {
  111.       return this.relativeURL;
  112.    }
  113.  
  114.    public String getNearestAnchor() {
  115.       return this.nearestAnchor;
  116.    }
  117.  
  118.    public final String getContext() {
  119.       return this.contextString;
  120.    }
  121.  
  122.    public final boolean isErrored() {
  123.       return !this.noHorribleError;
  124.    }
  125.  
  126.    public void setStartPattern(String var1) {
  127.       if (var1 == null) {
  128.          throw new NullPointerException("null pattern");
  129.       } else {
  130.          this.startPattern = var1;
  131.          this.useStartPattern = true;
  132.       }
  133.    }
  134.  
  135.    public String getStartPattern() {
  136.       return this.startPattern;
  137.    }
  138.  
  139.    public void stopUsingStartPattern() {
  140.       this.useStartPattern = false;
  141.    }
  142.  
  143.    public boolean isUsingStartPattern() {
  144.       return this.useStartPattern;
  145.    }
  146.  
  147.    public void setStopPattern(String var1) {
  148.       if (var1 == null) {
  149.          throw new NullPointerException("null pattern");
  150.       } else {
  151.          this.stopPattern = var1;
  152.          this.useStopPattern = true;
  153.       }
  154.    }
  155.  
  156.    public String getStopPattern() {
  157.       return this.stopPattern;
  158.    }
  159.  
  160.    public void stopUsingStopPattern() {
  161.       this.useStopPattern = false;
  162.    }
  163.  
  164.    public boolean isUsingStopPattern() {
  165.       return this.useStopPattern;
  166.    }
  167.  
  168.    public final synchronized boolean searchFor(String[] var1, boolean var2, boolean var3, boolean var4) throws InterruptedException {
  169.       this.contextString = null;
  170.       this.nearestAnchor = null;
  171.       if (!this.noHorribleError) {
  172.          return false;
  173.       } else {
  174.          boolean var5 = false;
  175.          boolean var9 = false;
  176.          boolean var10 = false;
  177.          boolean var11 = false;
  178.          SearchSieve var12 = null;
  179.          boolean var13 = false;
  180.          SearchSieve var14 = null;
  181.          boolean var15 = true;
  182.          Object var16 = null;
  183.          StringBuffer var17 = new StringBuffer();
  184.          StringBuffer var18 = null;
  185.          this.anchorFinder.reset();
  186.          int var19 = var1.length;
  187.          SearchSieve[] var20 = new SearchSieve[var19];
  188.  
  189.          for(int var21 = 0; var21 < var19; ++var21) {
  190.             var20[var21] = new SearchSieve(var1[var21].toLowerCase(), var2);
  191.          }
  192.  
  193.          if (this.useStopPattern) {
  194.             var12 = new SearchSieve(this.stopPattern, false);
  195.          }
  196.  
  197.          if (this.useStartPattern) {
  198.             var15 = false;
  199.             var14 = new SearchSieve(this.startPattern, false);
  200.          }
  201.  
  202.          if (!this.gotTitle) {
  203.             this.titleFinder.reset();
  204.             var18 = new StringBuffer();
  205.          }
  206.  
  207.          if (!this.openConnection()) {
  208.             return false;
  209.          } else {
  210.             CircularStringBuffer var31;
  211.             if (var2) {
  212.                var31 = new CircularStringBuffer(this.leadingContextLength + 1);
  213.             } else {
  214.                var31 = new CircularStringBuffer(this.leadingContextLength);
  215.             }
  216.  
  217.             while(!this.interruptSearch) {
  218.                int var6;
  219.                char var7;
  220.                try {
  221.                   var6 = this.bis.read();
  222.                   if (var6 == -1) {
  223.                      var7 = '\u0000';
  224.                   } else {
  225.                      var7 = (char)var6;
  226.                   }
  227.                } catch (IOException var27) {
  228.                   ((Throwable)var27).printStackTrace();
  229.                   this.closeConnection();
  230.                   return false;
  231.                }
  232.  
  233.                char var8 = Character.toLowerCase(var7);
  234.                if (!var10) {
  235.                   var10 = this.anchorFinder.addChar(var8);
  236.                } else {
  237.                   switch (var8) {
  238.                      case '\u0000':
  239.                      case '\t':
  240.                      case '\n':
  241.                      case '\r':
  242.                      case ' ':
  243.                      case '"':
  244.                      case '\'':
  245.                      case '>':
  246.                         if (var17.length() != 0) {
  247.                            this.nearestAnchor = var17.toString();
  248.                            var10 = false;
  249.                            var17.setLength(0);
  250.                         }
  251.                         break;
  252.                      default:
  253.                         var17.append(var7);
  254.                   }
  255.                }
  256.  
  257.                if (!this.gotTitle) {
  258.                   if (!var11) {
  259.                      var11 = this.titleFinder.addChar(var8);
  260.                   } else if (var8 != '<' && var6 != -1) {
  261.                      var18.append(var7);
  262.                   } else {
  263.                      if (var18.length() != 0) {
  264.                         this.title = var18.toString();
  265.                      }
  266.  
  267.                      var18 = null;
  268.                      this.titleFinder = null;
  269.                      this.gotTitle = true;
  270.                      var11 = false;
  271.                   }
  272.                }
  273.  
  274.                if (var8 == '<') {
  275.                   var9 = true;
  276.                }
  277.  
  278.                if ((!var3 || !var9) && var15) {
  279.                   var31.append(var7);
  280.  
  281.                   for(int var22 = 0; var22 < var19 && !var5; ++var22) {
  282.                      if (var20[var22].addChar(var8)) {
  283.                         if (!var4) {
  284.                            var5 = true;
  285.                         } else {
  286.                            --var19;
  287.                            if (var19 == 0) {
  288.                               var5 = true;
  289.                            } else {
  290.                               if (var22 != var19) {
  291.                                  System.arraycopy(var20, var22 + 1, var20, var22, var19 - var22);
  292.                                  --var22;
  293.                               }
  294.  
  295.                               var20[var19] = null;
  296.                            }
  297.                         }
  298.                      }
  299.                   }
  300.                }
  301.  
  302.                if (var8 == '>') {
  303.                   var9 = false;
  304.                }
  305.  
  306.                if (this.useStopPattern && !var13 && var15) {
  307.                   var13 = var12.addChar(var7);
  308.                }
  309.  
  310.                if (this.useStartPattern && !var15) {
  311.                   var15 = var14.addChar(var7);
  312.                }
  313.  
  314.                if (var6 == -1 || var5 || var13) {
  315.                   if (var6 != -1 && (var5 || var11)) {
  316.                      int var32 = 0;
  317.                      StringBuffer var23 = null;
  318.                      int var24 = -1;
  319.                      if (var5) {
  320.                         if (var2 && this.trailingContextLength > 0) {
  321.                            var24 = this.trailingContextLength - 1;
  322.                         } else {
  323.                            var24 = this.trailingContextLength;
  324.                         }
  325.  
  326.                         var23 = new StringBuffer(var31.getSize() + var24);
  327.                         var23.append(var31.toString());
  328.                      }
  329.  
  330.                      while(var11 || var5 && var32 < var24) {
  331.                         try {
  332.                            var6 = this.bis.read();
  333.                         } catch (IOException var26) {
  334.                            ((Throwable)var26).printStackTrace();
  335.                            var6 = -1;
  336.                         }
  337.  
  338.                         if (var6 == -1) {
  339.                            if (var11 && !this.gotTitle) {
  340.                               var11 = false;
  341.                               this.gotTitle = true;
  342.                               this.title = var18.toString();
  343.                               this.titleFinder = null;
  344.                            }
  345.                            break;
  346.                         }
  347.  
  348.                         var7 = (char)var6;
  349.                         if (var6 == 60) {
  350.                            var9 = true;
  351.                            if (var11 && !this.gotTitle) {
  352.                               var11 = false;
  353.                               this.gotTitle = true;
  354.                               this.title = var18.toString();
  355.                               this.titleFinder = null;
  356.                            }
  357.                         }
  358.  
  359.                         if (var6 == 62 && var9) {
  360.                            if (var11 && !this.gotTitle) {
  361.                               var18.append(var7);
  362.                            }
  363.  
  364.                            var9 = false;
  365.                            if (var3) {
  366.                               continue;
  367.                            }
  368.                         }
  369.  
  370.                         if (var11 && !this.gotTitle) {
  371.                            var18.append(var7);
  372.                         }
  373.  
  374.                         if (var5 && (!var9 || !var3) && var32 < var24) {
  375.                            var23.append(var7);
  376.                            ++var32;
  377.                         }
  378.                      }
  379.  
  380.                      if (var5) {
  381.                         this.contextString = var23.toString();
  382.                         this.contextString = SearchToHTML.makeHTMLSafe(this.contextString);
  383.                      }
  384.                   }
  385.  
  386.                   this.closeConnection();
  387.                   return var5;
  388.                }
  389.             }
  390.  
  391.             this.closeConnection();
  392.             throw new InterruptedException(this.relativeURL);
  393.          }
  394.       }
  395.    }
  396.  
  397.    public final void interruptSearch() {
  398.       this.interruptSearch = true;
  399.       synchronized(this){}
  400.  
  401.       try {
  402.          this.interruptSearch = false;
  403.       } catch (Throwable var3) {
  404.          throw var3;
  405.       }
  406.  
  407.    }
  408.  
  409.    private boolean openConnection() {
  410.       try {
  411.          URLConnection var1 = this.url.openConnection();
  412.          if (!this.gotDocumentInfo) {
  413.             this.gotDocumentInfo = true;
  414.             Date var2 = new Date(var1.getLastModified());
  415.             int var3 = var2.getYear();
  416.             int var4 = var1.getContentLength();
  417.             StringBuffer var5 = new StringBuffer();
  418.             if (var4 > 1024) {
  419.                var5.append(var4 / 1024);
  420.                var5.append('k');
  421.             } else if (var4 > 0) {
  422.                var5.append(var4);
  423.                var5.append('b');
  424.             }
  425.  
  426.             if (var3 > 71) {
  427.                var5.append(", ");
  428.                var5.append(months[var2.getMonth()]);
  429.                var5.append(' ');
  430.                var5.append(var2.getDate());
  431.                var5.append(", ");
  432.                var5.append(var3 + 1900);
  433.             }
  434.  
  435.             if (var5.length() > 0) {
  436.                this.documentInfo = var5.toString();
  437.             }
  438.          }
  439.  
  440.          this.bis = new BufferedInputStream(var1.getInputStream());
  441.          return true;
  442.       } catch (FileNotFoundException var6) {
  443.          ((Throwable)var6).printStackTrace();
  444.          this.closeConnection();
  445.          this.noHorribleError = false;
  446.          return false;
  447.       } catch (IOException var7) {
  448.          ((Throwable)var7).printStackTrace();
  449.          this.closeConnection();
  450.          return false;
  451.       } catch (SecurityException var8) {
  452.          ((Throwable)var8).printStackTrace();
  453.          this.noHorribleError = false;
  454.          this.closeConnection();
  455.          return false;
  456.       }
  457.    }
  458.  
  459.    private final void closeConnection() {
  460.       try {
  461.          if (this.bis != null) {
  462.             this.bis.close();
  463.          }
  464.       } catch (IOException var6) {
  465.          ((Throwable)var6).printStackTrace();
  466.       } finally {
  467.          this.bis = null;
  468.       }
  469.  
  470.    }
  471. }
  472.